package com.bro.person.base.service;


import com.bro.person.base.model.paging.PagingResult;

import java.io.Serializable;
import java.util.List;

/**
 * crud操作等基础的BaseService
 * @author jdd
 */
public interface IBroBaseService<T extends Serializable, TCriteria extends Serializable,ID extends Serializable> {

    /**
     * 保存
     * @param entity
     * @return
     */
     int save(T entity);


    /**
     * 保存并返回实体对象
     * 通常在rpc（对象序列化）后，实体对象的变更无法传递回调用方时使用
     * @param entity
     * @return
     */
     T saveAndReturn(T entity);

    /**
     * 主键更新
     * @param entity
     * @return
     */
     int updateById(T entity);

    /**
     * 条件更新
     * @param entity
     * @param criteria
     * @return
     */
     int updateByCriteria(T entity, TCriteria criteria);

    /**
     * 按id删除
     * @param id
     * @return
     */
     int deleteById(ID id);

    /**
     * 按条件删除
     * @param criteria
     * @return
     */
     int deleteByCriteria(TCriteria criteria);

    /**
     * 按id加载
     * @param id
     * @return
     */
     T loadById(ID id);

    /**
     * 按条件查询
     *
     * @param criteria
     * @return
     */
     List<T> queryByCriteria(TCriteria criteria);

    /**
     * 查询所有
     * 注意效率问题
     * @return
     */
     List<T> queryAll();

    /**
     * 查询所有（支持排序）
     * 注意效率问题
     * @param orderByClause
     * @return
     */
     List<T> queryAll(String orderByClause);

    /**
     * 按条件count
     * @param criteria
     * @return
     */
     int countByCriteria(TCriteria criteria);

    /**
     * 批量插入数据库记录
     *
     * @param records
     * @return
     */
    int insertBatchSelective(List<T> records);

    /**
     * 根据主键批量更新数据记录
     *
     * @param records
     * @return
     */
    int updateBatchByPrimaryKeySelective(List<T> records);


    /**
     * 分页查询
     * @param pageNo
     * @param pageSize
     * @param criteria
     * @return
     */
    PagingResult<T> pagingByCriteria(int pageNo, int pageSize, TCriteria criteria, T entity);

}
